package cn.izeno.wx.models.component

import cn.izeno.wx.DK
import cn.izeno.wx.core.parseXml
import org.simpleframework.xml.Element
import org.simpleframework.xml.Root

/**
 * component_verify_ticket的有效时间较component_access_token更长，
 * 建议保存最近可用的component_verify_ticket，
 * 在component_access_token过期之前使用该ticket进行更新，
 * 避免出现因为ticket接收失败而无法更新component_access_token的情况。
 */
@DK
@Root(name = "xml", strict = false)
class Event {
  /**
   * 第三方公众平台应用 appid
   */
  @field:Element(name = "AppId", required = false)
  var appId: String = ""

  @field:Element(name = "Encrypt", required = false)
  var encrypt: String = ""

  @field:Element(name = "CreateTime", required = false)
  var createdAt: String = ""

  /**
   * - component_verify_ticket 第三方平台 ticket
   *
   * - authorized 授权成功
   * - unauthorized 取消授权
   * - updateauthorized 授权更新
   * - notify_third_fasteregister 快速创建小程序通知 [cn.izeno.wx.service.ComponentService.weappFastRegister]
   */
  @field:Element(name = "InfoType", required = false)
  var infoType: String = ""

  /**
   * [TICKET] 时有效
   */
  @field:Element(name = "ComponentVerifyTicket", required = false)
  var ticket: String = ""


  /**
   * - [AUTH],[RE_AUTH],[UN_AUTH] 时有效
   */
  @field:Element(name = "AuthorizerAppid", required = false)
  var authAppId: String = ""

  /**
   * - [AUTH],[RE_AUTH] 时有效
   */
  @field:Element(name = "AuthorizationCode", required = false)
  var authCode: String = ""

  /**
   * - [AUTH],[RE_AUTH] 时有效
   */
  @field:Element(name = "AuthorizationCodeExpiredTime", required = false)
  var expiredAt: Long = 0
    set(value) {
      field = when {
        value in 1..7200 -> System.currentTimeMillis() + value * 1000
        else -> value
      }
    }

  /**
   * - [AUTH],[RE_AUTH] 时有效
   */
  @field:Element(name = "PreAuthCode", required = false)
  var preAuthCode: String = ""

  /**
   * [WEAPP_FAST_CREATE] 时有效
   *
   * - 100001 已下发的模板消息法人并未确认且已超时（24h），未进行身份证校验
   * - 100002 已下发的模板消息法人并未确认且已超时（24h），未进行人脸识别校验
   * - 100003 已下发的模板消息法人并未确认且已超时（24h）
   *
   * - 101	  工商数据返回：“企业已注销”
   * - 102	  工商数据返回：“企业不存在或企业信息未更新”
   * - 103	  工商数据返回：“企业法定代表人姓名不一致”
   * - 104	  工商数据返回：“企业法定代表人身份证号码不一致”
   * - 105	  法定代表人身份证号码，工商数据未更新，请5-15个工作日之后尝试
   * - 1000	  工商数据返回：“企业信息或法定代表人信息不一致”
   * - -1	    企业与法人姓名不一致
   */
  @field:Element(name = "status", required = false)
  var weappCreateStatus: Int = 0

  /**
   * [WEAPP_FAST_CREATE] 时有效
   * xxxxx第三方授权码
   */
  @field:Element(name = "auth_code", required = false)
  var weappFastCreateAuthCode: String = ""


  /**
   * [WEAPP_FAST_CREATE] 时有效
   */
  @field:Element(name = "msg", required = false)
  var weappFastCreateMessage: String = ""


  /**
   * [FAST_CREATE_WEAPP]
   * 创建小程序 appid
   */
  @field:Element(name = "appid", required = false)
  var weappFastCreateAppid: String? = null


  @field:Element(required = false)
  var info: FastCreateWeappInfo? = null

  companion object {
    /** ticket 推送 */
    const val TICKET = "component_verify_ticket"
    /** 第三方授权成功 */
    const val AUTH = "authorized"
    /** 第三方授权更新 */
    const val RE_AUTH = "updateauthorized"
    /** 第三方授权取消 */
    const val UN_AUTH = "unauthorized"

    /**
     * 快速创建小程序通知
     */
    const val WEAPP_FAST_CREATE = "notify_third_fasteregister"


    fun fromXml(xmlString: String): Event {
      return parseXml(Event::class.java, xmlString)
    }
  }
}